using System;
using System.Threading;
using System.Threading.Tasks;
using BanZuiCloudControlAgent.Core.Tasks.Base;
using BanZuiCloudControlAgent.Core.Tasks.Models;

namespace BanZuiCloudControlAgent.Core.Tasks.Specific.QQ
{
    /// <summary>
    /// 邀请好友任务，用于邀请好友加入QQ群
    /// </summary>
    public class InviteFriendTask : BaseTask
    {
        /// <summary>
        /// 执行邀请好友任务
        /// </summary>
        /// <param name="context">任务上下文</param>
        /// <returns>任务结果</returns>
        public override async Task<TaskResult> ExecuteAsync(TaskContext context)
        {
            try
            {
                SetTaskStarted();
                _logger.Info($"开始执行邀请好友任务: {TaskId}");
                
                // 获取参数
                string friendQQ = GetParameter<string>("friendQq");
                int inviteCount = GetParameter<int>("inviteCount", 1);
                int inviteIntervalMin = GetParameter<int>("inviteIntervalMin", 10);
                int inviteIntervalMax = GetParameter<int>("inviteIntervalMax", 20);
                
                if (string.IsNullOrEmpty(friendQQ))
                {
                    _logger.Warn("邀请好友任务参数错误: 好友QQ号为空");
                    return TaskResult.Failure("邀请好友任务参数错误: 好友QQ号为空");
                }
                
                _logger.Info($"邀请好友任务参数: 好友QQ={friendQQ}, 邀请次数={inviteCount}, 邀请间隔={inviteIntervalMin}-{inviteIntervalMax}秒");
                
                // TODO: 实现邀请好友逻辑
                // 这里只是框架，具体业务逻辑由用户自行实现
                
                // 模拟任务进度
                UpdateProgress(0);
                
                // 使用CancellationToken来支持取消
                using (var cts = new CancellationTokenSource())
                {
                    // 模拟邀请过程
                    for (int i = 0; i < inviteCount; i++)
                    {
                        // 检查暂停和取消状态
                        if (!await CheckPauseAndCancellationAsync(cts.Token))
                        {
                            _logger.Info($"邀请好友任务被取消或暂停: {TaskId}");
                            var cancelResult = TaskResult.Canceled("任务被用户取消");
                            SetTaskCompleted(cancelResult);
                            return cancelResult;
                        }
                        
                        UpdateProgress((i + 1) * 100 / inviteCount);
                        _logger.Info($"邀请好友任务进度: {i+1}/{inviteCount}");
                        
                        // 使用带暂停检查的延迟方法
                        int delayTime = new Random().Next(inviteIntervalMin, inviteIntervalMax + 1) * 200;
                        if (!await DelayWithPauseCheckAsync(delayTime, cts.Token))
                        {
                            _logger.Info($"邀请好友任务在等待过程中被取消: {TaskId}");
                            var cancelResult = TaskResult.Canceled("任务在等待过程中被用户取消");
                            SetTaskCompleted(cancelResult);
                            return cancelResult;
                        }
                    }
                }
                
                UpdateProgress(100);
                
                // 返回成功结果
                var result = TaskResult.Success($"邀请好友任务完成，成功邀请{inviteCount}次");
                SetTaskCompleted(result);
                return result;
            }
            catch (Exception ex)
            {
                _logger.Error($"执行邀请好友任务时发生异常: {ex.Message}", ex);
                var result = TaskResult.Failure("执行邀请好友任务时发生异常", ex);
                SetTaskCompleted(result);
                return result;
            }
        }
    }
} 